package cn.vivi.design.single;

/**
 * 懒汉式单例
 */
public class Singleton2 {

    /**
     * 对象的创建过程中jvm会进行指令的重排序
     * 1.分配空间
     * 3.初始化成员属性
     * 2.返回引用地址
     * volatile 关键字，防止指令重排序
     */
    private volatile static Singleton2 instance;

    private Singleton2() {
        if (instance != null) {
            throw new RuntimeException("当前对象已经存在");
        }
    }

    public static Singleton2 getInstance() {
        // 如果判断为 null，不需要抢占锁，较少锁粒度
        if (instance == null) {
            synchronized (Singleton2.class) {
                // 先有了这个判断，才有的外面的判断
                if (instance == null) {
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }
}
